/**
 * 项目名：五位一体化工安全信息平台
 * 日期：    2019-11-24 22:18:20
 * Copyright (c) 2015- joysuch-版权所有
 */

package com.joysuch.wwyt.risk.service;

import com.joysuch.wwyt.core.common.ajax.ResultBean;
import com.joysuch.wwyt.core.exception.ApiBusinessException;
import com.joysuch.wwyt.risk.bean.*;
import com.joysuch.wwyt.risk.bean.RiskPointListBean.Search;
import com.joysuch.wwyt.risk.entity.RiskDistrict;
import com.joysuch.wwyt.risk.entity.RiskEvaluationRepo;
import com.joysuch.wwyt.risk.entity.RiskPoint;
import com.joysuch.wwyt.risk.entity.RiskPointType;
import com.joysuch.wwyt.risk.entity.vo.RiskPointVo;
import com.joysuch.wwyt.risk.enums.EvaluationTypes;
import com.joysuch.wwyt.risk.enums.RiskPointStates;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface RiskPointService {

    RiskPoint add(RiskPoint entity) throws Exception;

    RiskPoint update(RiskPoint entity, Long riskDistrictId) throws Exception;

    Page<RiskPointListBean> findByPage(Pageable page, Search condition);

    Page<RiskPointListBean> findByPage(Pageable page, Long riskDistrictId);

    void delete(Long id) throws ApiBusinessException;

    RiskPoint findById(Long id);

    RiskPoint findByIdIgnoreDeleteStatus(Long id);

    List<RiskPoint> findByIdInIgnoreDeleteStatus(Set<Long> idSet);

    /**
     * 设置分级管控信息
     *
     * @param bean 分级管控信息
     */
    void setControlLevel(RiskPointControlLevelBean bean);

    Page<RiskLevelListBean> findRiskLevelControlPage(Pageable page, RiskLevelListSearchBean search, Integer flag);

    public Page<RiskPointInDistrictListBean> findRiskPointsInDistrictPage(Pageable page,
                                                                          RiskPointControlRiskListSearchBean condition);

    List<RiskPointInDistrictListBean> findAll(Long riskDistrictId);

    /**
     * 风险分区-控制风险评估-scl评估提交。
     * 业务逻辑如下：
     * 1. 如果是第一次评估,生成评估记录，则将风险级别写入风险点
     * 2. 如果是第二次/后续评估，将评级信息和JHA信息比较，如果较大，则更新风险评级，同时产生一条报警信息。如果风险级别小于JHA，则只保存记录，不更新风险点的风险级别
     *
     * @param bean 风险评估数据
     */
    public RiskEvaluationRepo doSclEvaluation(RiskSclEvaluationBean bean);

    public RiskEvaluationRepo doSclEvaluationNew(RiskSclEvaluationNewBean bean);

    /**
     * 风险分区-控制风险评估-jha评估提交。
     * 业务逻辑如下：
     * 1. 如果是第一次评估,生成评估记录，则将风险级别写入风险点
     * 2. 如果是第二次/后续评估，将评级信息和SCL信息比较，如果较大，则更新风险评级，同时产生一条报警信息。如果风险级别小于SCL，则只保存记录，不更新风险点的风险级别
     *
     * @param bean 风险评估数据
     */
    public RiskEvaluationRepo doJhaEvaluation(RiskJhaEvaluationBean bean);

    /**
     * 安全作业，风险评估，可以新建风险点。
     * 业务逻辑如下：
     * 1. 如果是第一次评估,生成评估记录，则将风险级别写入风险点
     * 2. 如果是第二次/后续评估，将评级信息和SCL信息比较，如果较大，则更新风险评级，同时产生一条报警信息。如果风险级别小于SCL，则只保存记录，不更新风险点的风险级别
     *
     * @param bean 风险评估数据
     */
    public RiskEvaluationRepo doJhaEvaluation(RiskJhaEvaluationNewBean bean);

    /**
     * 查询风险点分析详情
     *
     * @param id 风险点ID
     * @return 分析详情
     */
    public RiskPointEvaluationDetailBean queryEvaluationDetail(@Valid Long id);

    /**
     * 分页查询安全风险分级管控清单
     *
     * @param page      分页数据
     * @param condition 查询条件
     * @return 分页查询结果
     */
    public Page<RiskPointEvaluationDetailBean> findSafetyControlListPage(Pageable page,
                                                                         RiskPointSafetyControlListSearchBean condition);

    public void deleteEvaluation(@Valid Long id, @Valid String type);

    /**
     * 风险点，风险评估记录
     *
     * @param page
     * @param condition
     * @return
     */
    public Page<RiskPointEvaluationBean> findRiskPointEvaluationHistory(Pageable page, Long id,
                                                                        RiskPointSafetyControlListSearchBean condition);

    /**
     * 更新风险点风险级别
     *
     * @param id 风险点ID
     */
    public void updateRiskPointRiskLevel(Long id);

    public void updateRiskPointState(Long id, RiskPointStates state);

    /**
     * 更新评估状态
     *
     * @param riskPointId  风险点ID
     * @param type         评估类型
     * @param evaluationId 评估ID
     */
    public void updateEvaluationStatus(Long riskPointId, EvaluationTypes type, Long evaluationId);

    /**
     * 查询评估模板。
     *
     * @param id                  风险点ID
     * @param type                评估类型
     * @param useOthersEvaluation 当此风险点没有评估时，是否使用其他风险点的评估。true:使用，false：不使用
     * @return
     */
    public RiskPointEvaluationBean queryEvaluationTemplate(Long id, String type, boolean useOthersEvaluation);

    public Page<RiskPointListBean> findSharedByPage(Pageable page, Search condition);

    public List<RiskPointInDistrictListBean> findSharedSimpleList(String type);

    ResultBean todayRisk();

    Map<String, Object> pointPdfPrint(Long id);

    ResultBean riskSum();

    ResultBean riskAreaPoint();

    RiskPointType addPointType(RiskPointTypeBean bean);

    RiskPointType updatePointType(RiskPointTypeBean bean);

    List<RiskPointTypeGroupBean> findPointType();

    List<RiskCodeAndNameBean> findTypeList(String typeCode);

    void deletePointType(Long typeId);

    String getTypeName(String code);

    void editPointTypeOrderNumber(Long upTypeId, Long downTypeId);

    ResultBean submitAudit(Long id);

    ResultBean audit(RiskPointAuditBean bean);

    void deletePoints(List<Long> ids);

    RiskPointShowBean getById(Long riskPointId);

    RiskPointType checkTypeAndSubType(String type, String subTypeName);

    Long addRiskPoint(RiskPointVo riskPointVo) throws ApiBusinessException;

    ResultBean updateRiskPoint(RiskPointVo riskPointVo);

    /**
     * 查询风险点数量 审核通过的风险点
     * @param flag 0 : 所有数量 1: 拥有位置的数量
     * @return
     */
    Long getNumForHaveLocation(Integer flag);

    /**
     * 查询所有拥有位置的风险点 审核通过的风险点
     * @return
     */
    List<RiskPoint> findAllHaveLocation();

    Map<Long,RiskDistrict> findPointDistrictMap(Collection<Long> ids);

    List<RiskPointBeanVo> findList();

    List<RiskPoint> findByIds(List<Long> pointIds);
}
